{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Logistic Function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:22: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1152x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "fig, ax = plt.subplots(1, 1, figsize=(16, 8))\n",
    "\n",
    "theta = np.arange(-10, 10, 0.05)\n",
    "y = 1 / (1 + np.exp(-1 * theta))\n",
    "\n",
    "pd.DataFrame(\n",
    "    {\n",
    "        'theta': theta,\n",
    "        'y': y\n",
    "    }\n",
    ").plot(\n",
    "    title='Logistic Function', \n",
    "    kind='scatter', x='theta', y='y', \n",
    "    ax=ax\n",
    ")\n",
    "\n",
    "ax.set_yticks(np.arange(0, 1.25, step=0.5))\n",
    "\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Iris Dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "from sklearn import datasets\n",
    "iris = datasets.load_iris()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "# It's customary to call dataframes df\n",
    "\n",
    "df = pd.DataFrame(\n",
    "    iris.data,\n",
    "    columns=iris.feature_names\n",
    ")\n",
    "\n",
    "df['target'] = pd.Series(\n",
    "    iris.target\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sepal length (cm)</th>\n",
       "      <th>sepal width (cm)</th>\n",
       "      <th>petal length (cm)</th>\n",
       "      <th>petal width (cm)</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>69</th>\n",
       "      <td>5.6</td>\n",
       "      <td>2.5</td>\n",
       "      <td>3.9</td>\n",
       "      <td>1.1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>4.8</td>\n",
       "      <td>3.4</td>\n",
       "      <td>1.6</td>\n",
       "      <td>0.2</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>5.1</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)  \\\n",
       "69                5.6               2.5                3.9               1.1   \n",
       "11                4.8               3.4                1.6               0.2   \n",
       "0                 5.1               3.5                1.4               0.2   \n",
       "\n",
       "    target  \n",
       "69       1  \n",
       "11       0  \n",
       "0        0  "
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.sample(n=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "df_train, df_test = train_test_split(df, test_size=0.3, random_state=22)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_train = df_train[iris.feature_names]\n",
    "x_test  = df_test[iris.feature_names]\n",
    "\n",
    "y_train = df_train['target']\n",
    "y_test  = df_test['target']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Logistic Regression: Accuracy (6-fold): 0.94 ~ 0.99\n"
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.model_selection import cross_validate\n",
    "\n",
    "\n",
    "num_folds = 6\n",
    "\n",
    "clf = LogisticRegression(solver='lbfgs', multi_class='multinomial', max_iter=1000)\n",
    "\n",
    "accuracy_scores = cross_validate(clf, df[iris.feature_names], df['target'], cv=num_folds, scoring=['accuracy'])\n",
    "\n",
    "accuracy_mean = pd.Series(accuracy_scores['test_accuracy']).mean()\n",
    "accuracy_std = pd.Series(accuracy_scores['test_accuracy']).std()\n",
    "accuracy_sterror = accuracy_std / np.sqrt(num_folds)\n",
    "\n",
    "print(\n",
    "    'Logistic Regression: Accuracy ({}-fold): {:.2f} ~ {:.2f}'.format(\n",
    "        num_folds,\n",
    "        (accuracy_mean - 1.96 * accuracy_sterror),\n",
    "        (accuracy_mean + 1.96 * accuracy_sterror),\n",
    "    )\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "clf.fit(x_train, y_train)\n",
    "\n",
    "# We use dictionary comprehension instead of a for-loop\n",
    "df_coef = pd.DataFrame(\n",
    "   {\n",
    "        f'Coef [Class {class_id}]': clf.coef_[class_id]\n",
    "        for class_id in range(clf.coef_.shape[0])\n",
    "    },\n",
    "    index=iris.feature_names\n",
    ")\n",
    "df_coef.loc['intercept', :] = clf.intercept_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Coef [Class 0]</th>\n",
       "      <th>Coef [Class 1]</th>\n",
       "      <th>Coef [Class 2]</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>sepal length (cm)</th>\n",
       "      <td>-0.403139</td>\n",
       "      <td>0.447732</td>\n",
       "      <td>-0.044593</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sepal width (cm)</th>\n",
       "      <td>0.854393</td>\n",
       "      <td>-0.520388</td>\n",
       "      <td>-0.334005</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>petal length (cm)</th>\n",
       "      <td>-2.246269</td>\n",
       "      <td>-0.166679</td>\n",
       "      <td>2.412948</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>petal width (cm)</th>\n",
       "      <td>-0.974846</td>\n",
       "      <td>-0.680131</td>\n",
       "      <td>1.654976</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>intercept</th>\n",
       "      <td>8.869417</td>\n",
       "      <td>2.572456</td>\n",
       "      <td>-11.441873</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   Coef [Class 0]  Coef [Class 1]  Coef [Class 2]\n",
       "sepal length (cm)       -0.403139        0.447732       -0.044593\n",
       "sepal width (cm)         0.854393       -0.520388       -0.334005\n",
       "petal length (cm)       -2.246269       -0.166679        2.412948\n",
       "petal width (cm)        -0.974846       -0.680131        1.654976\n",
       "intercept                8.869417        2.572456      -11.441873"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_coef"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Decision Tree Classifier: Accuracy (6-fold): 0.92 ~ 0.98\n"
     ]
    }
   ],
   "source": [
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.model_selection import cross_validate\n",
    "\n",
    "num_folds = 6\n",
    "\n",
    "clf = DecisionTreeClassifier(max_depth=3)\n",
    "accuracy_scores = cross_validate(clf, df[iris.feature_names], df['target'], cv=num_folds, scoring=['accuracy'])\n",
    "\n",
    "accuracy_mean = pd.Series(accuracy_scores['test_accuracy']).mean()\n",
    "accuracy_std = pd.Series(accuracy_scores['test_accuracy']).std()\n",
    "accuracy_sterror = accuracy_std / np.sqrt(num_folds)\n",
    "\n",
    "print(\n",
    "    'Decision Tree Classifier: Accuracy ({}-fold): {:.2f} ~ {:.2f}'.format(\n",
    "        num_folds,\n",
    "        (accuracy_mean - 1.96 * accuracy_sterror),\n",
    "        (accuracy_mean + 1.96 * accuracy_sterror),\n",
    "    )\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Function to Plot the Decision Boundaries\n",
    "\n",
    "def plot_decision_boundary(clf, x, y, ax, title):\n",
    "    \n",
    "    cmap='Paired_r'\n",
    "    \n",
    "    feature_names = x.columns\n",
    "    x, y = x.values, y.values\n",
    "    \n",
    "    x_min, x_max = x[:,0].min(), x[:,0].max()\n",
    "    y_min, y_max = x[:,1].min(), x[:,1].max()\n",
    "    \n",
    "    step = 0.02\n",
    "    \n",
    "    xx, yy = np.meshgrid(\n",
    "        np.arange(x_min, x_max, step),\n",
    "        np.arange(y_min, y_max, step)\n",
    "    )\n",
    "    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])\n",
    "    Z = Z.reshape(xx.shape)\n",
    "\n",
    "    ax.contourf(xx, yy, Z, cmap=cmap, alpha=0.25)\n",
    "    ax.contour(xx, yy, Z, colors='k', linewidths=0.7)\n",
    "    ax.scatter(x[:,0], x[:,1], c=y, edgecolors='k')\n",
    "    ax.set_title(title)\n",
    "    ax.set_xlabel(feature_names[0])\n",
    "    ax.set_ylabel(feature_names[1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "df_train, df_test = train_test_split(df, test_size=0.3, random_state=22)\n",
    "\n",
    "x_train = df_test[iris.feature_names]\n",
    "x_test  = df_test[iris.feature_names]\n",
    "\n",
    "y_train = df_train['target']\n",
    "y_test  = df_test['target']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:30: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n"
     ]
    },
    {
     "data": {
      "image/png": "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iEiNoAZDZA+0bZXBm8/dv0fLKCgs5H8TP+K/Y18mc+UqAFyx8+t8koKiQs667BpSrktiQL9eREdF+T2umXHiMYerORERERFPqcEQCbHYmBhGHn8sI48/dsc0f88/KSgs5I33PuShseOZPGWaX3d+38E5Jn7yOSnXJXHy8UeTkpxcrbp77LcvRx0xUM2JiIiIlKEGQ6QWi42J4bQTj+O0E4/DuV3fM6S0gsJCXn/3Qx5+ZjzPv/oWZv7v/QBHcXERKXWSuPickey7b/tqjd0wvT69e3RVcyIiIhKG1GCIhInq/mc9LjaWM4YP4fRhx7FqzToKi4r8n9k5psz4joefGc99jz2NP/cr2VlKUh3GXHg2hw8+oNxrq1evJit72y6X0bhxQ13BS0REpIZRgyES4cyMJns1rPZ8Z540lDOGD+G3hUvIztlSrXnn/L6Ax59/ndsffJy7Hnqi3Ov+3WIRMGPfDh146J7raNOqRbVqiI+LIyGhepcmFhERkV1TgyEiu83M6LR322rP12f/rpwz4kS+mzmbBUv+LPf6xo2bqOfHnomPPvuGmXNnM2jImURHV+cQrxKd9+7Ao/ffSJdOHao9r4iIiFRMDYaIhISZ0bdHN/r26FbuNX9Pcj9j+BCyc7Yw7n/vsGpN9e5jMn/BMubMn8dBR59GXGxsteYF6NS+PY/cfyP77rN3tecVEREJZ2owRKRWS0lO4rJzTtuteTfn5PD4C6/yy9z51Zpvw8Yt/PLbfA48aiR1k5P9umfJds45WrdowSP330jnjtU7OV5ERKQ2UIMhIhGrbnIy1192wW7Nuzknh0eefZkPP5terfmKnWP2b78x8MhTqZ+WRmJCAgAzPnidpJTdKkWCrMdBJ7Dwj6WhLsMjfp/xFKYief0jed0hEte/Y8eOfPPNN0EZSw2GiMhuqJuczE3/vJib/nlxtefNys7hkWdfYsIHn5OXnw3A5k2bSGrpdZUSCJNffzbUJXjG38MRw1Ukr38krztE5vqn7d0jaGOpwRARCbLUlGRuvvwSbr78klCXIiIi4rnqX3ZFRERERESkEmowRERERETEM2owRERERETEM2owRERERETEM2owRERERETEM2owRERERETEM2owRERERETEM2owRERERETEM2owRERERETEM2owRERERETEM2owRERERETEM2owRERERETEM2ow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\n",
      "text/plain": [
       "<Figure size 864x432 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "    \n",
    "fig, axs = plt.subplots(1, 2, figsize=(12, 6))\n",
    "\n",
    "two_features = ['petal width (cm)', 'petal length (cm)']\n",
    "\n",
    "\n",
    "clf_lr = LogisticRegression()\n",
    "clf_lr.fit(df_train[two_features], df_train['target'])\n",
    "accuracy = accuracy_score(\n",
    "    df_test['target'], \n",
    "    clf_lr.predict(df_test[two_features])\n",
    ")\n",
    "plot_decision_boundary(\n",
    "    clf_lr, df_test[two_features], df_test['target'], ax=axs[0], \n",
    "    title=f'Logistic Regression Classifier\\nAccuracy: {accuracy:.2%}'\n",
    ")\n",
    "\n",
    "clf_dt = DecisionTreeClassifier(max_depth=3)\n",
    "clf_dt.fit(df_train[two_features], df_train['target'])\n",
    "accuracy = accuracy_score(\n",
    "    df_test['target'], \n",
    "    clf_dt.predict(df_test[two_features])\n",
    ")\n",
    "plot_decision_boundary(\n",
    "    clf_dt, df_test[two_features], df_test['target'], ax=axs[1], \n",
    "    title=f'Decision Tree Classifier\\nAccuracy: {accuracy:.2%}'\n",
    ")\n",
    "\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Class 0 Boundary: 1e+01 - 1.1 * petal width (cm) - 2.5 * petal length (cm)\n",
      "Class 1 Boundary: 2.7 - 0.66 * petal width (cm) + 0.088 * petal length (cm)\n",
      "Class 2 Boundary: -1.3e+01 + 1.7 * petal width (cm) + 2.4 * petal length (cm)\n"
     ]
    }
   ],
   "source": [
    "coef_sign = lambda c: '+' if c >= 0 else '-'\n",
    "\n",
    "for i, coef_pair in enumerate(clf_lr.coef_):\n",
    "    print(\n",
    "        'Class {class_id} Boundary: {intercept} {coef0} {coef1}'.format(\n",
    "            class_id=i,\n",
    "            intercept=f'{clf_lr.intercept_[i]:.2}',\n",
    "            coef0=f'{coef_sign(coef_pair[0])} {abs(coef_pair[0]):.2} * {two_features[0]}',\n",
    "            coef1=f'{coef_sign(coef_pair[1])} {abs(coef_pair[1]):.2} * {two_features[1]}',\n",
    "        )\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
